//
// Created by 49647 on 2023/6/3.
//
#include <iostream>

struct A {
    A() {
        printf("%p ctor\n", this);
    }

    A(const A &) {
        printf("%p copy ctor\n", this);
    }

    A(A &&) {
        printf("%p move ctor\n", this);
    }

    ~A() {
        printf("%p dtor\n", this);
    }
};

A f_RVO() {
    return A();
}

A f_NRVO() {
    A a;
    printf("%p in func\n", &a);
    return a;
}

A f() {
    A a;
    return std::move(a);
}

int main() {
    // A a = f_RVO();
    A a = f();
    printf("%p in main\n", &a);
    return 0;
}